﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

namespace CH_k
{
    [Serializable]
    public class LoElement : Element
    {
        [CategoryAttribute("Свойства"), DescriptionAttribute("Количество элементов подключенных к выходу")]
        public int К_выходу_подключено
        {
            get
            {
                return outElList.Count;
            }
        }
        [CategoryAttribute("Свойства"), DescriptionAttribute("Количество входов у элемента")]
        public int Количество_входов
        {
            get
            {
                return input_n;
            }
            set
            {
                if (value >= 2 && value <= 8)
                {
                    if (input_n > value)
                    {
                        for (int i = value; i < input_n; ++i)
                        {
                            if (inElList[i] != null)
                            {
                                MessageBox.Show("К " + i + "-му входу подключен элемент! Уменьшить количество входов невозможно");
                                return;
                            }
                        }
                    }
                    input_n = value;
                    size = new Point(20, 10 + value * 10);
                }
                else 
                {
                    MessageBox.Show("Количество входов должно быть от 2 до 8");
                }
            }
        } 

        public LoElement()
        {
            for (int i = 0; i < 8; ++i)
            {
                inElList.Add(null);
            }

        }
        public override void Delete()
        {
            for (int i = 0; i < input_n; ++i)
            {
                if (inElList[i] != null)
                {
                    Element tRef = inElList[i];
                    inElList[i].Delete();
                    seList.Remove(tRef);
                    inElList[i] = null;
                }
            }
            for (int i = 0; i < outElList.Count; ++i)
            {
                if (outElList[i] != null)
                {
                    Element tRef = outElList[i];
                    outElList[i].Delete();
                    seList.Remove(tRef);
                    --i;
                }
            }
        }
        public override void TryClickOutput(Point TCord)
        {
            if ((TCord.X == dec.X + 40) && (TCord.Y == dec.Y + 10))
            {
                if (Element.newElement.ElType == "ELine")
                {
                    Element.newElement.TrySetInput(TCord, this);
                }
            }
        }
        public override void TryClickInput(Point TCord)
        {
            if (TCord.X == dec.X)
            {
                for (int i = 0; i < input_n; i++)
                {
                    if (TCord.Y == dec.Y + 10 + (i * 10))
                    {
                        if (inElList[i] == null)
                        {
                            Element.newElement.TrySetOutput(TCord, i, this);
                        }
                    }
                }
            }
        }
        public override void ELineUpdate()
        {
            for (int i = 0; i < 8; ++i)
            {
                if (inElList[i] != null)
                {
                    inElList[i].output_p = new Point(dec.X, dec.Y + 10 + (i * 10));
                    inElList[i].pCalc();
                }
            }
            foreach (Element el in outElList)
            {
                el.input_p = new Point(dec.X + 40, dec.Y + 10);
                el.pCalc();
            }
        }
    }
}
